package thread;

import java.awt.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @User: vitobo
 * @Date: 2024-08-05
 * @Description: 线程池的使用
 *
 *    工厂模式: 使用普通的方法, 来代替构造方法, 创建对象; 将对象的创建过程与使用过程分离
 *
 *
 */

public class ThreadDemo26 {
    public static void main(String[] args) {
        // newFixedThreadPool使用类的某个静态方法, 直接构造出一个对象来(相当于是把new操作,给隐藏到这样的方法后面了)
        // Executors"工厂类", newFixedThreadPool"工厂方法" ==> 工厂模式
        // 创建一个线程池, 池子里线程数目 固定是10个

        // Executors 是一个工具类，提供了多种创建线程池的静态方法。
        // newFixedThreadPool(10) 方法创建了一个固定大小为 10 的线程池。
        // ExecutorService 是一个接口，表示线程池的执行服务。
        ExecutorService pool = Executors.newFixedThreadPool(10);



        // 允许程序之后发现, main线程结束了, 但是整个进程没有结束; 线程池中的线程都是 前台线程,此时会阻止线程结束
        // 往线程池中放入  1000个任务, 10个线程平均分配这些任务; 每个线程执行完一个任务后, 再立即取下一个任务;
        for (int i = 0; i < 1000; i++) {
            // 变量捕获,让run方法把刚才主线程的i给当前run的栈上拷贝一份; (抹平声明周期的差异)
            // 此处i是有修改的,而n是没有修改的, 虽然没有final修改,但是也能捕获了;
            int n = i;
            // submit()提交任务到线程池
            pool.submit(new Runnable() {
                @Override
                public void run() {
                    System.out.println("hello " + n);
                }
            });
        }
    }
}